"""author: wenyao
   data: 2021/3/26
   project: devopscmdb
"""

#字典
#键值映射  key - value
#无序
#可变数据类型
#key唯一的，天生去重


######字典的定义###############
# >>> d1 = {}
# >>> type(d1)
# <class 'dict'>
# >>> d2 = dict()
# >>> d2
# {}
# >>> d3 = {"apple":10, "bana":5}
# >>> lst = [1,2,3]
# >>> d4 = dict(lst)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
# >>> lst = [('root','123456'),('admin','admin')]
# >>> d4 = dict(lst)
# >>> d4
# {'root': '123456', 'admin': 'admin'}


#字典是无序的
#python3.6之后  字典的存储做了优化
# [root@C yum.repos.d]# python2
# Python 2.7.17 (default, Aug 31 2020, 21:02:14)
# [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux2
# Type "help", "copyright", "credits" or "license" for more information.
# >>> a = {"a":1,"c":2,"d":1,"b":3,"g":4}
# >>> a
# {'a': 1, 'c': 2, 'b': 3, 'd': 1, 'g': 4}
# >>> exit()
# [root@C yum.repos.d]# python3
# Python 3.6.8 (default, Apr 16 2020, 01:36:27)
# [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux
# Type "help", "copyright", "credits" or "license" for more information.
# >>> a = {"a":1,"c":2,"d":1,"b":3,"g":4}
# >>> a
# {'a': 1, 'c': 2, 'd': 1, 'b': 3, 'g': 4}
# >>>

######
# 字典的定义
# • 字典的key必须是可hash对象（不可变数据类型）
# • python中所有字符串、数字、元组、布尔值、None都是可hash对象
# • 字典的value可以是任何值
# >>> a = {True:2}
# >>> a = {[1]:"a"}
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# TypeError: unhashable type: 'list'
# >>>
# >>> a = {"a":1,"a":2}
# >>> a
# {'a': 2}



##################新增、修改、 取值#####################
#查看
#一、dict[key]    #当key不存在的时候会报错
# >>> a = {"a":1,"b":2,"c":3,"d":2}
# >>> a['b']
# 2
# >>> a['e']
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'e'

#二、dict.get(key,default)  获取key的值，如果没有就返回default默认值
# >>> a.get("a",0)
# 1
# >>> a.get("e",0)
# 0
# >>> c = a.get("e")   #没有相应的key，也没有设定默认值，默认返回None
# >>> print(c)
# None


#新增和修改
#用法1：dicts[key] = value
# • 当key不存在时，表示增加一个键值对
# • 当key存在时，表示修改对应的value值
# >>> a
# {'a': 1, 'b': 2, 'c': 3, 'd': 2}
# >>> a['e']=5
# >>> a
# {'a': 1, 'b': 2, 'c': 3, 'd': 2, 'e': 5}
# >>> a['b']=4
# >>> a
# {'a': 1, 'b': 4, 'c': 3, 'd': 2, 'e': 5}


# 字典基本操作-删除
# • 用法1：dicts.pop(key)
# • 用法2：dicts.popitem()
# >>> a
# {'a': 1, 'b': 4, 'c': 3, 'd': 2, 'e': 5}
# >>> a.pop('a')
# 1
# >>> a
# {'b': 4, 'c': 3, 'd': 2, 'e': 5}
# >>> a.popitem()
# ('e', 5)
# >>> a.popitem()
# ('d', 2)
# >>> a
# {'b': 4, 'c': 3}

#########################合并
#用法1：dict1.update(dict2) => 将dict2合并到dict1
#用法2：dict(dict1, **dict2) => 将dict1与dict2合并生成一个新字典
# >>> a
# {'b': 4, 'c': 3}
# >>> b = {"xx":1,"yy":2}
# >>> a
# {'b': 4, 'c': 3}
# >>> b
# {'xx': 1, 'yy': 2}
# >>> id(a)
# 139755887036888
# >>> a.update(b)
# >>> a
# {'b': 4, 'c': 3, 'xx': 1, 'yy': 2}
# >>> id(a)
# 139755887036888
# >>> dict(a,**b)
# {'b': 4, 'c': 3, 'xx': 1, 'yy': 2}
# >>> a
# {'b': 4, 'c': 3, 'xx': 1, 'yy': 2}
# >>> b
# {'xx': 1, 'yy': 2}
# >>> c = {"hh":3}
# >>> dict(a,**c)
# {'b': 4, 'c': 3, 'xx': 1, 'yy': 2, 'hh': 3}
# >>> a
# {'b': 4, 'c': 3, 'xx': 1, 'yy': 2}
# >>> c
# {'hh': 3}

#########成员关系
#默认都是判断字典的key值
# >>> a
# {'b': 4, 'c': 3, 'xx': 1, 'yy': 2}
# >>> 'b' in a
# True
# >>> 4 in a
# False
# >>> 4 in a.values()
# True
# >>> a.values()
# dict_values([4, 3, 1, 2])
# >>> a.keys()
# dict_keys(['b', 'c', 'xx', 'yy'])
# >>> 'b' in a.keys()
# True

############字典遍历#######################
#默认遍历字典的key值
# >>> for i in a:
# ...   print(i)
# ...
# b
# c
# xx
# yy
# >>> for i in a.keys():
# ...   print(i)
# ...
# b
# c
# xx
# yy
# >>> for i in a.items():
# ...    print(i)
# ...
# ('b', 4)
# ('c', 3)
# ('xx', 1)
# ('yy', 2)
# >>> for i,j in a.items():
# ...    print(f'key -- {i}, value -- {j}')
# ...
# key -- b, value -- 4
# key -- c, value -- 3
# key -- xx, value -- 1
# key -- yy, value -- 2

# >>> for i in a.items():
# ...    print(f'key -- {i[0]}, value -- {i[1]}')
# ...
# key -- b, value -- 4
# key -- c, value -- 3
# key -- xx, value -- 1
# key -- yy, value -- 2

######练习
#报名系统
#登陆 root 123456
  #1、查看报名详情
       #  姓名    爱好   家庭住址
       #  戴军    唱歌    娄底
       # 胥子珍  追剧    陕西
  #2、报名
  #  输入 姓名 爱好 家庭住址
  #3、退出系统

# 农大好声音选手名单
#1、选手的名字：蒋才果  爱好：打游戏   家庭住址
#2、可以增加

#用户检测
# print("欢迎使用用户检测系统".center(100,"*"))
# Udict = {'root':'123456','admin':'admin'}
# while True:
#     Uname = input("请输入用户名（输入quit退出）：")
#     if Uname == 'quit':
#         print("您已退出".center(100,'*'))
#         break
#     elif Uname in Udict:
#         Upwd = input("请输入密码：")
#         if Udict[Uname] == Upwd:
#             print("检测成功！".center(100,'*'))
#             # break
#         else:
#             print("检测失败，密码错误！")
#     else:
#         print("检测失败！用户名错误")

#字典的实现原理
#哈希函数（hash）
#把任意长度的字符串，通过hash算法映射成固定长度的输出
#     固定长度的输出就是散列值

#散列表  表元  偏移量  哈希  散列冲突

#https://cloud.tencent.com/developer/article/1664241